﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Linq;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using Maticsoft.DBUtility;

namespace JSTT_DATA_ENTITY
{
    public static class EntityCommon
    {
        private static JSTT_DATA_ENTITY.JSTT_DBSEntities jsttEntity = new JSTT_DBSEntities();


        /// <summary>
        /// 根据DTUSIM获得DEVICEID
        /// </summary>
        /// <param name="dtusim"></param>
        /// <returns></returns>
        public static int GetDeviceIDByDTUSIM(string dtusim)
        {
            if (jsttEntity.TD_DEVICE.Where(t => t.DEVICE_DTU_SIM == dtusim).Count() > 0)
            {
                return jsttEntity.TD_DEVICE.Where(t => t.DEVICE_DTU_SIM == dtusim).Select(t => t.TD_ID).First();
            }
            return 0;
        }

        public static List<TD_DATATYPE_FORMAT_RULES> GetDataTypeFormatRulesList()
        {
            return jsttEntity.TD_DATATYPE_FORMAT_RULES.ToList();
        }

        /// <summary>
        /// 将数据插入到TF_JSTT_DATAS数据表保存
        /// </summary>
        /// <param name="tf_jstt_dev_data"></param>
        /// <returns></returns>
        public static bool InsertDataToTF_JSTT_DATAS(I_JSTT_DEV_DATA tf_jstt_dev_data)
        {
            Type t = tf_jstt_dev_data.GetType();
            if (tf_jstt_dev_data == null || EntityCommon.GetDeviceByID(tf_jstt_dev_data.JST_DEVICE_ID)==null)
                return false;

            //if (EntityCommon.UpdateDeviceStatus(tf_jstt_dev_data) == false)
            //    return false;

            try
            {
                //switch (t.FullName)
                //{
                //    case "JSTT_DATA_ENTITY.TF_JSTT_DATAS_T01":
                //        jsttEntity.TF_JSTT_DATAS_T01.Add((TF_JSTT_DATAS_T01)tf_jstt_dev_data);
                //        break;
                //    case "JSTT_DATA_ENTITY.TF_JSTT_DATAS_T02":
                //        jsttEntity.TF_JSTT_DATAS_T02.Add((TF_JSTT_DATAS_T02)tf_jstt_dev_data);
                //        break;
                //    case "JSTT_DATA_ENTITY.TF_JSTT_DATAS_T03":
                //        jsttEntity.TF_JSTT_DATAS_T03.Add((TF_JSTT_DATAS_T03)tf_jstt_dev_data);
                //        break;
                //    case "JSTT_DATA_ENTITY.TF_JSTT_DATAS_T04":
                //        jsttEntity.TF_JSTT_DATAS_T04.Add((TF_JSTT_DATAS_T04)tf_jstt_dev_data);
                //        break;
                //    case "JSTT_DATA_ENTITY.TF_JSTT_DATAS_T05":
                //        jsttEntity.TF_JSTT_DATAS_T05.Add((TF_JSTT_DATAS_T05)tf_jstt_dev_data);
                //        break;
                //}
                //jsttEntity.SaveChanges();

                //// TODO : 更新Currency表
                //EntityCommon.UpdateDataCurrency(tf_jstt_dev_data);

                


                // TODO : 更新DEVICE_STATUS表
                return true;
            }
            catch(Exception e)
            {
                return false;
            }
        }


        /// <summary>
        /// 根据数据，更新数据状态表
        /// </summary>
        /// <param name="tf_jstt_dev_data"></param>
        public static bool UpdateDeviceStatus(I_JSTT_DEV_DATA tf_jstt_dev_data)
        {
            //List<TF_DEVICE_STATUS> tf_dev_status_list = EntityCommon.GetDevStatusByDevID(tf_jstt_dev_data.JST_DEVICE_ID);

            //TF_DEVICE_STATUS opt_dev_status = new TF_DEVICE_STATUS();
            //opt_dev_status.loaded_date = System.DateTime.Now;

            //opt_dev_status.DS_DEVICE_ID = tf_jstt_dev_data.JST_DEVICE_ID;
            //opt_dev_status.DS_LOADED_TIME = tf_jstt_dev_data.JST_DATE;
            //opt_dev_status.DS_POWERON_TIME = tf_jstt_dev_data.JST_DATE;
            //opt_dev_status.DS_DTU_SIM = tf_jstt_dev_data.JST_DEVICE_SIM;
            //opt_dev_status.DS_UPDATE_TIME = tf_jstt_dev_data.JST_DATE;
            //opt_dev_status.DS_STSUS_CODE = tf_jstt_dev_data.JST_DATA_EXCPT_TYPE;
            //opt_dev_status.DS_ONLINE = 0;
            //opt_dev_status.DS_UPDATER = "DEVICE_AUTO";
            //opt_dev_status.DS_CURRENT_STATUS = tf_jstt_dev_data.JST_DATA_EXCPT_TYPE == 1 ? (byte)1 : (byte)2;  // 如果异常数据的值为1，则表示正常(1),否则就是异常(2)


            //if (tf_dev_status_list != null && tf_dev_status_list.Count > 0)
            //{
            //    // 如果DEVICE_STATUS表中的更新日期 > 最新收到的设备数据日期，视为无效数据
            //    if (DateTime.Compare(tf_dev_status_list[0].DS_UPDATE_TIME, tf_jstt_dev_data.JST_DATE) > 0)
            //        return false;

                
            //    // 设定DEVICE_STATUS 对象的数据
            //    opt_dev_status.DS_LOADED_TIME = tf_dev_status_list[0].DS_LOADED_TIME;
            //    if (EntityCommon.IsDevExpired(tf_dev_status_list[0]))
            //    {
            //        opt_dev_status.DS_POWERON_TIME = tf_jstt_dev_data.JST_DATE;
            //    }
            //    else
            //    {
            //        opt_dev_status.DS_POWERON_TIME = tf_dev_status_list[0].DS_POWERON_TIME;
            //    }
                
            //    tf_dev_status_list.ForEach(t=>jsttEntity.TF_DEVICE_STATUS.Remove(t));
            //    //opt_dev_status
            //    return true;
            //}

            //jsttEntity.TF_DEVICE_STATUS.Add(opt_dev_status);
            //jsttEntity.SaveChanges();
            return true;
        }

        public static void UpdateReceiveLog(string ipaddress, int ipport, string data,int dataLength,string dtu)
        {
            TF_RECIVE_DATAS_LOG recv_data_log = new TF_RECIVE_DATAS_LOG();
            recv_data_log.RECEIVE_DATETIME = System.DateTime.Now;
            recv_data_log.RECEIVE_IPADDRESS = ipaddress;
            recv_data_log.RECEIVE_PORT = ipport;
            recv_data_log.RECEIVE_DATA_LENGTH = dataLength;
            recv_data_log.RECEIVE_DTU = dtu;
            recv_data_log.RECEIVE_DATAS = data;
            jsttEntity.TF_RECIVE_DATAS_LOG.Add(recv_data_log);
            jsttEntity.SaveChanges();
        }
        /// <summary>
        /// 根据接收的数据，更新CURRENCY表
        /// </summary>
        /// <param name="tf_jstt_dev_data"></param>
        public static void UpdateDataCurrency(I_JSTT_DEV_DATA tf_jstt_dev_data)
        {
            //TF_JSTT_DATAS_CURRENCY jstt_data_currency = new TF_JSTT_DATAS_CURRENCY();
            //jstt_data_currency.JST_DEVICE_ID = tf_jstt_dev_data.JST_DEVICE_ID;
            //jstt_data_currency.JST_DEVICE_SIM = tf_jstt_dev_data.JST_DEVICE_SIM;
            //jstt_data_currency.JST_DATA_SEND_TYPE = tf_jstt_dev_data.JST_DATA_SEND_TYPE;
            //jstt_data_currency.JST_AFTERCONTROL_EXIST = tf_jstt_dev_data.JST_DATA_SEND_TYPE;
            //jstt_data_currency.JST_DATA_EXCPT_TYPE = tf_jstt_dev_data.JST_DATA_EXCPT_TYPE;
            //jstt_data_currency.JST_DATATYPE_ID = tf_jstt_dev_data.JST_DATATYPE_ID;
            //jstt_data_currency.JST_DATA_DEV_ID = tf_jstt_dev_data.JST_DATA_DEV_ID;
            //jstt_data_currency.JST_DATE = tf_jstt_dev_data.JST_DATE;
            //jstt_data_currency.JST_PT_VAL = tf_jstt_dev_data.JST_PT_VAL;
            //jstt_data_currency.JST_A_VOL_VAL = tf_jstt_dev_data.JST_A_VOL_VAL;
            //jstt_data_currency.JST_B_VOL_VAL = tf_jstt_dev_data.JST_B_VOL_VAL;
            //jstt_data_currency.JST_C_VOL_VAL = tf_jstt_dev_data.JST_C_VOL_VAL;
            //jstt_data_currency.JST_CT_VAL = tf_jstt_dev_data.JST_CT_VAL;
            //jstt_data_currency.JST_A_ELEC_VAL= tf_jstt_dev_data.JST_A_ELEC_VAL;
            //jstt_data_currency.JST_B_ELEC_VAL= tf_jstt_dev_data.JST_B_ELEC_VAL;
            //jstt_data_currency.JST_C_ELEC_VAL= tf_jstt_dev_data.JST_C_ELEC_VAL;
            //jstt_data_currency.JST_N_ELEC_VAL= tf_jstt_dev_data.JST_N_ELEC_VAL;
            //jstt_data_currency.JST_A_POWER_FACTOR= tf_jstt_dev_data.JST_A_POWER_FACTOR;
            //jstt_data_currency.JST_B_POWER_FACTOR= tf_jstt_dev_data.JST_B_POWER_FACTOR;
            //jstt_data_currency.JST_C_POWER_FACTOR= tf_jstt_dev_data.JST_C_POWER_FACTOR;
            //jstt_data_currency.JST_A_ACT_POWER= tf_jstt_dev_data.JST_A_ACT_POWER;
            //jstt_data_currency.JST_B_ACT_POWER= tf_jstt_dev_data.JST_B_ACT_POWER;
            //jstt_data_currency.JST_C_ACT_POWER= tf_jstt_dev_data.JST_C_ACT_POWER;
            //jstt_data_currency.JST_A_REACT_POWER= tf_jstt_dev_data.JST_A_REACT_POWER;
            //jstt_data_currency.JST_B_REACT_POWER= tf_jstt_dev_data.JST_B_REACT_POWER;
            //jstt_data_currency.JST_C_REACT_POWER= tf_jstt_dev_data.JST_C_REACT_POWER;
            //jstt_data_currency.JST_A_RATE= tf_jstt_dev_data.JST_A_RATE;
            //jstt_data_currency.JST_B_RATE= tf_jstt_dev_data.JST_B_RATE;
            //jstt_data_currency.JST_C_RATE= tf_jstt_dev_data.JST_C_RATE;
            //jstt_data_currency.JST_A_ACT_ENERGY= tf_jstt_dev_data.JST_A_ACT_ENERGY;
            //jstt_data_currency.JST_B_ACT_ENERGY= tf_jstt_dev_data.JST_B_ACT_ENERGY;
            //jstt_data_currency.JST_C_ACT_ENERGY= tf_jstt_dev_data.JST_C_ACT_ENERGY;
            //jstt_data_currency.JST_A_REACT_ENERGY= tf_jstt_dev_data.JST_A_REACT_ENERGY;
            //jstt_data_currency.JST_B_REACT_ENERGY= tf_jstt_dev_data.JST_B_REACT_ENERGY;
            //jstt_data_currency.JST_C_REACT_ENERGY= tf_jstt_dev_data.JST_C_REACT_ENERGY;

            //List<TF_JSTT_DATAS_CURRENCY> jstt_data_old_currencys = GetDevDataByDevID(jstt_data_currency.JST_DEVICE_ID);
            //if (jstt_data_old_currencys != null || jstt_data_old_currencys.Count > 0)
            //{
            //    jstt_data_old_currencys.ForEach(t => jsttEntity.TF_JSTT_DATAS_CURRENCY.Remove(t));
            //    jsttEntity.SaveChanges();
            //}
            //jstt_data_currency.loaded_date = tf_jstt_dev_data.loaded_date;

            //jsttEntity.TF_JSTT_DATAS_CURRENCY.Add(jstt_data_currency);
        }

        /// <summary>
        /// 根据设备ID，找到对应的设备
        /// </summary>
        /// <param name="dev_id"></param>
        /// <returns></returns>
        public static TD_DEVICE GetDeviceByID(int dev_id)
        {
            try
            {
                TD_DEVICE ret_dev = jsttEntity.TD_DEVICE.Where(t => t.TD_ID == dev_id).First();
                return ret_dev;
            }
            catch (Exception e)
            {
                return null;
            }
        }

        ///// <summary>
        ///// 根据设备ID，找到TF_JSTT_DATAS_CURRENCY的所有设备数据
        ///// </summary>
        ///// <param name="dev_id"></param>
        ///// <returns></returns>
        //public static List<TF_JSTT_DATAS_CURRENCY> GetDevDataByDevID(int dev_id)
        //{
        //    try
        //    {
        //        return jsttEntity.TF_JSTT_DATAS_CURRENCY.Where(t => t.JST_DEVICE_ID == dev_id).ToList();
        //    }
        //    catch (Exception)
        //    {
        //        return null;
        //    }
        //}

        ///// <summary>
        ///// 根据DEVID找到设备状态
        ///// </summary>
        ///// <param name="dev_id"></param>
        ///// <returns></returns>
        //public static List<TF_DEVICE_STATUS> GetDevStatusByDevID(int dev_id)
        //{
        //    try
        //    {
        //        return jsttEntity.TF_DEVICE_STATUS.Where(t => t.DS_DEVICE_ID == dev_id).ToList();
        //    }
        //    catch (Exception)
        //    {
        //        return null;
        //    }
        //}

        //public static bool IsDevExpired(TF_DEVICE_STATUS dev_sts)
        //{
        //    return IsDevExpired(dev_sts.DS_UPDATE_TIME);
        //}

        public static bool IsDevExpired(DateTime dtime)
        {
            TimeSpan diff_ts = DateTime.Now - dtime;
            if (diff_ts.TotalHours > 5)
            {
                return true;
            }
            return false;
        }


       
    }
}
